package com.pethospital.service;

import com.pethospital.entity.Appointment;
import com.pethospital.entity.PageResult;

import java.sql.Date;
import java.sql.Time;
import java.util.List;

/**
 * 预约服务接口
 * Appointment Service Interface
 * 
 * @author PetHospital System
 * @version 1.0
 */
public interface AppointmentService {
    
    /**
     * 根据预约ID查询预约
     * 
     * @param appointmentId 预约ID
     * @return Appointment 预约对象
     */
    Appointment getAppointmentById(Integer appointmentId);
    
    /**
     * 根据主人ID查询预约列表
     * 
     * @param ownerId 主人ID
     * @return List<Appointment> 预约列表
     */
    List<Appointment> getAppointmentsByOwnerId(Integer ownerId);
    
    /**
     * 根据宠物ID查询预约列表
     * 
     * @param petId 宠物ID
     * @return List<Appointment> 预约列表
     */
    List<Appointment> getAppointmentsByPetId(Integer petId);
    
    /**
     * 添加预约
     * 
     * @param appointment 预约对象
     * @return boolean 添加是否成功
     */
    boolean addAppointment(Appointment appointment);
    
    /**
     * 更新预约信息
     * 
     * @param appointment 预约对象
     * @return boolean 更新是否成功
     */
    boolean updateAppointment(Appointment appointment);
    
    /**
     * 删除预约
     * 
     * @param appointmentId 预约ID
     * @return boolean 删除是否成功
     */
    boolean deleteAppointment(Integer appointmentId);
    
    /**
     * 批量删除预约
     * 
     * @param appointmentIds 预约ID数组
     * @return boolean 删除是否成功
     */
    boolean batchDeleteAppointments(Integer[] appointmentIds);
    
    /**
     * 查询所有预约
     * 
     * @return List<Appointment> 预约列表
     */
    List<Appointment> getAllAppointments();
    
    /**
     * 分页查询预约
     * 
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Appointment> 分页结果
     */
    PageResult<Appointment> getAppointmentsByPage(int currentPage, int pageSize);
    
    /**
     * 根据主人ID分页查询预约
     * 
     * @param ownerId 主人ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Appointment> 分页结果
     */
    PageResult<Appointment> getAppointmentsByOwnerAndPage(Integer ownerId, int currentPage, int pageSize);
    
    /**
     * 根据条件搜索预约
     * 
     * @param petName 宠物姓名（模糊查询）
     * @param serviceType 服务类型
     * @param status 预约状态
     * @param appointmentDate 预约日期
     * @param ownerId 主人ID（可选，为null时查询所有）
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return PageResult<Appointment> 分页结果
     */
    PageResult<Appointment> searchAppointments(String petName, String serviceType, String status, 
                                             Date appointmentDate, Integer ownerId, int currentPage, int pageSize);
    
    /**
     * 统计预约总数
     * 
     * @return long 预约总数
     */
    long getTotalAppointmentCount();
    
    /**
     * 根据主人ID统计预约数量
     * 
     * @param ownerId 主人ID
     * @return long 预约数量
     */
    long getAppointmentCountByOwner(Integer ownerId);
    
    /**
     * 根据预约状态统计数量
     * 
     * @param status 预约状态
     * @return long 预约数量
     */
    long getAppointmentCountByStatus(String status);
    
    /**
     * 根据日期统计预约数量
     *
     * @param appointmentDate 预约日期
     * @return long 预约数量
     */
    long getAppointmentCountByDate(Date appointmentDate);

    /**
     * 统计今日预约数量
     *
     * @return long 今日预约数量
     */
    long getTodayAppointmentCount();

    /**
     * 根据主人ID统计今日预约数量
     *
     * @param ownerId 主人ID
     * @return long 今日预约数量
     */
    long getTodayAppointmentCountByOwnerId(Integer ownerId);

    /**
     * 统计待处理预约数量
     *
     * @return long 待处理预约数量
     */
    long getPendingAppointmentCount();

    /**
     * 根据主人ID统计待处理预约数量
     *
     * @param ownerId 主人ID
     * @return long 待处理预约数量
     */
    long getPendingAppointmentCountByOwnerId(Integer ownerId);
    
    /**
     * 更新预约状态
     * 
     * @param appointmentId 预约ID
     * @param status 预约状态
     * @return boolean 更新是否成功
     */
    boolean updateAppointmentStatus(Integer appointmentId, String status);
    
    /**
     * 分配医生
     * 
     * @param appointmentId 预约ID
     * @param doctorName 医生姓名
     * @return boolean 分配是否成功
     */
    boolean assignDoctor(Integer appointmentId, String doctorName);
    
    /**
     * 获取预约状态统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[状态, 数量]
     */
    List<Object[]> getStatusStatistics();
    
    /**
     * 获取服务类型统计信息
     * 
     * @return List<Object[]> 统计结果，每个数组包含[服务类型, 数量]
     */
    List<Object[]> getServiceTypeStatistics();
    
    /**
     * 查询今日预约
     * 
     * @return List<Appointment> 今日预约列表
     */
    List<Appointment> getTodayAppointments();
    
    /**
     * 查询待处理预约
     * 
     * @return List<Appointment> 待处理预约列表
     */
    List<Appointment> getPendingAppointments();
    
    /**
     * 查询即将到期的预约（未来7天内）
     *
     * @return List<Appointment> 即将到期的预约列表
     */
    List<Appointment> getUpcomingAppointments();

    /**
     * 根据主人ID查询最近的预约记录
     *
     * @param ownerId 主人ID
     * @param limit 限制数量
     * @return List<Appointment> 最近的预约列表
     */
    List<Appointment> getRecentAppointmentsByOwnerId(Integer ownerId, int limit);
    
    /**
     * 检查时间冲突
     * 
     * @param appointmentDate 预约日期
     * @param appointmentTime 预约时间
     * @param excludeId 排除的预约ID（用于更新时排除自己）
     * @return boolean 是否存在冲突
     */
    boolean checkTimeConflict(Date appointmentDate, Time appointmentTime, Integer excludeId);
    
    /**
     * 验证预约数据
     * 
     * @param appointment 预约对象
     * @param isUpdate 是否为更新操作
     * @return String 验证结果，null表示验证通过，否则返回错误信息
     */
    String validateAppointment(Appointment appointment, boolean isUpdate);
    
    /**
     * 检查用户是否有权限操作该预约
     * 
     * @param appointmentId 预约ID
     * @param userId 用户ID
     * @param isAdmin 是否为管理员
     * @return boolean 是否有权限
     */
    boolean hasPermission(Integer appointmentId, Integer userId, boolean isAdmin);
    
    /**
     * 获取所有服务类型
     * 
     * @return List<String> 服务类型列表
     */
    List<String> getAllServiceTypes();
    
    /**
     * 获取所有医生列表
     * 
     * @return List<String> 医生列表
     */
    List<String> getAllDoctors();
    
    /**
     * 获取可用的预约时间段
     * 
     * @param appointmentDate 预约日期
     * @return List<String> 可用时间段列表
     */
    List<String> getAvailableTimeSlots(Date appointmentDate);
    
    /**
     * 确认预约
     * 
     * @param appointmentId 预约ID
     * @return boolean 确认是否成功
     */
    boolean confirmAppointment(Integer appointmentId);
    
    /**
     * 取消预约
     * 
     * @param appointmentId 预约ID
     * @param reason 取消原因
     * @return boolean 取消是否成功
     */
    boolean cancelAppointment(Integer appointmentId, String reason);
    
    /**
     * 完成预约
     * 
     * @param appointmentId 预约ID
     * @return boolean 完成是否成功
     */
    boolean completeAppointment(Integer appointmentId);
    
    /**
     * 导入预约数据
     * 
     * @param appointments 预约列表
     * @return int 成功导入的数量
     */
    int importAppointments(List<Appointment> appointments);
    
    /**
     * 导出预约数据
     * 
     * @param ownerId 主人ID（可选，为null时导出所有）
     * @return List<Appointment> 预约列表
     */
    List<Appointment> exportAppointments(Integer ownerId);
}
